package sql;

import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
 * 创建时间：2017年12月28日14:49 <br>
 * 作者：fuchaoyang <br>d
 * 描述：
 */

public class SqlHelper extends SQLiteOpenHelper {
  public static final String DB_NAME = "test.db";
  // 表明必须写成常量，所有引用地方不能直接写字符串，引用常量，删除字段的话好复制表，改表名的方式
  public static final String TABLE_PERSON = "Person";
  public static final int DB_VERSION = 1;

  public SqlHelper(Context context) {
    super(context, DB_NAME, null, DB_VERSION);
  }

  @Override public void onCreate(SQLiteDatabase db) {
    // SQLite数据创建支持的数据类型： 整型数据，字符串类型（VARCHAR，TEXT），日期类型，二进制的数据类型
    String sql =
        "create table if not exists Person(id integer primary key autoincrement,name varchar,note text default('暂无'));";
    // 数据库实际上是没有被创建或者打开的，直到getWritableDatabase() 或者 getReadableDatabase() 方法中的一个被调用时才会进行创建或者打开
    try {
      db.execSQL(sql);
    } catch (SQLException ex) {
      ex.printStackTrace();
    }
  }

  /**
   * 版本号升级时会回调
   * fixme 必须要进行版本判断
   * 只能升级不能降级
   */
  @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    System.out.println("onUpgrade():" + oldVersion + "," + newVersion);

    // alter table $table_name add key type 往表中增加一列
    if (oldVersion == 1 && newVersion == 2) {
      DBManager.execSQL(db, "alter table %s add age integer default(18)", TABLE_PERSON);
    } else if (oldVersion == 2 && newVersion == 3) {
      // 2升级3的时候，删除了某个字段
      // 1.copy并更改表名，必须使用事务，防止某一步出错
      String temp = "temp";
      try {
        db.beginTransaction();
        DBManager.execSQL(db, "create table %s as select id,name from %s", temp, TABLE_PERSON);
        // 2.删除旧的表 Person
        db.execSQL("drop table " + TABLE_PERSON);
        // 3.将表名重命名
        DBManager.execSQL(db, "alter table %s rename to %s", temp, TABLE_PERSON);
        db.setTransactionSuccessful();
      } catch (Exception ex) {
        ex.printStackTrace();
      } finally {
        db.endTransaction();
      }
    }
  }
}
